package com.liang.shortlink.project.mq.idempotent;

import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * 消息队列幂等处理器
 */
@Component
@RequiredArgsConstructor
public class IdempotentHandler {

    private final StringRedisTemplate redisTemplate;

    private static final String IDEMPOTENT_KEY_PREFIX = "short_link:idempotent:";

    /**
     * 判断消息是否已消费
     *
     * @param messageId 消息Id
     * @return true: 已消费 false: 未消费
     */
    public boolean isConsumed(String messageId) {
        String key = IDEMPOTENT_KEY_PREFIX + messageId;
        return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(key, "0", 2, TimeUnit.MINUTES));
    }

    /**
     * 如果消息消费异常，删除幂等标识
     *
     * @param messageId 消息Id
     */
    public void delete(String messageId) {
        String key = IDEMPOTENT_KEY_PREFIX + messageId;
        redisTemplate.delete(key);
    }

    /**
     * 判断消息消费流程是否执行完成
     *
     * @param messageId 消息Id
     * @return 消息是否执行完成
     */
    public boolean isAccomplish(String messageId) {
        String key = IDEMPOTENT_KEY_PREFIX + messageId;
        return Objects.equals(redisTemplate.opsForValue().get(key), "1");
    }

    /**
     * 设置消息流程执行完成
     *
     * @param messageId 消息唯一标识
     */
   public void setAccomplish(String messageId) {
       String key = IDEMPOTENT_KEY_PREFIX + messageId;
       redisTemplate.opsForValue().set(key, "1", 2, TimeUnit.MINUTES);
   }
}
